package com.tsy.server.map.service;

import com.tsy.server.map.model.dto.GroupElementDTO;
import com.dji.sdk.cloudapi.map.*;
import com.dji.sdk.common.HttpResultResponse;

import java.util.List;
import java.util.Optional;

/**
 * @author sean
 * @version 0.2
 * @date 2021/11/30
 */
public interface IWorkspaceElementService {

    /**
     * 根据工作空间ID查询该空间下的所有分组，
     * 包含分组内的元素信息和元素中的坐标信息。
     * @param workspaceId 工作空间ID
     * @param groupId 分组ID
     * @param isDistributed 是否分发
     * @return
     */
    List<GetMapElementsResponse> getAllGroupsByWorkspaceId(String workspaceId, Long projectId, String groupId, Boolean isDistributed);

    /**
     * 保存所有元素信息，包含分组内的元素信息和元素中的坐标信息。
     *
     * @param workspaceId 工作空间ID
     * @param groupId 分组ID
     * @param elementCreate 元素创建请求
     * @param notify 是否通知
     * @return
     */
    HttpResultResponse saveElement(String workspaceId, String groupId, CreateMapElementRequest elementCreate, boolean notify);

    /**
     * 根据元素ID更新元素信息，包含分组内的元素信息和元素中的坐标信息。
     *
     * @param workspaceId 工作空间ID
     * @param elementId 元素ID
     * @param elementUpdate 元素更新请求
     * @param username 用户名
     * @param notify 是否通知
     * @return
     */
    HttpResultResponse updateElement(String workspaceId, String elementId, UpdateMapElementRequest elementUpdate, String username, boolean notify);

    /**
     * 根据元素ID删除元素信息，包含分组内的元素信息和元素中的坐标信息。
     *
     * @param workspaceId 工作空间ID
     * @param elementId 元素ID
     * @param notify 是否通知
     * @return
     */
    HttpResultResponse deleteElement(String workspaceId, String elementId, boolean notify);

    /**
     * 根据元素ID查询元素信息，包含分组内的元素信息和元素中的坐标信息。
     * @param elementId 元素ID
     * @return
     */
    Optional<GroupElementDTO> getElementByElementId(String elementId);

    /**
     * 根据分组ID删除该分组下的全部元素信息，
     * 包含分组内的元素信息和元素中的坐标信息。
     *
     * @param workspaceId 工作空间ID
     * @param groupId 分组ID
     * @return
     */
    HttpResultResponse deleteAllElementByGroupId(String workspaceId, String groupId);

    MapElementCreateWsResponse element2CreateWsElement(GroupElementDTO element);

    MapElementUpdateWsResponse element2UpdateWsElement(GroupElementDTO element);
}